class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char,int>hash1;
        unordered_map<char,int>hash2;
        int start=0;
        int minlen=1e5+1;
        
        for(auto&ch:t) hash1[ch]++;
        int target=hash1.size();
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            //count表示我们有效字符的种类
            char in=s[right];
            hash2[in]++;
            if(hash2[in]==hash1[in]) count++;//判断条件时候会导致 hash1的size会发生变化
            //合法的时候出窗口
            while(count==target)
            {
                if(right-left+1<minlen)
                {
                    start=left;
                    minlen=right-left+1;
                }
                
                char out=s[left];
                if(hash2[out]==hash1[out]) count--;
                hash2[out]--;
                left++;
            }
        }
        if(minlen==1e5+1) return "";
        else return s.substr(start,minlen);
    }
};